# -*- coding = utf-8 -*-
 
# 导入模块
import requests
from lxml import etree
from PIL import Image
import pytesseract
import time
import json
 
 
# 定义一个函数，用于获取一个请求头来伪装成浏览器；
def request_header():
    headers = {
        # 常见浏览器的请求头伪装（如：火狐,谷歌）
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)'
                      ' Chrome/107.0.0.0 Safari/537.36'
    }
    return headers
 
# 定于一个函数，用于处理图片上的杂线
def process_img(img: Image, dstImgPath: str):
    for i in range(img.size[0]):
        for j in range(img.size[1]):
            r, g, b = img.getpixel((i, j))
            # 将干扰线像素值变为纯白色
            if r >= 90 and g >= 90 and b >= 90:
                img.putpixel((i, j), (255, 255, 255))
    img.save(dstImgPath)
 
 
# 获取得到访问的session
def get_session():
 
    # 访问招聘页面登录界面
    response = requests.get(url='http://www.techlabplt.com:8085/user/login',
                            timeout=2, headers=request_header())
    text = response.text
    html = etree.HTML(text)
    # 通过xpath获取验证码的链接地址
    code_url = "http://www.techlabplt.com:8085/" + str(html.xpath('//*[@id="identify_img"]/@src')[0])
 
    # 使用session让请求之间具有连贯性，保证在这里下载的验证码和下面登录时的验证码是同一个验证码
    proxy_session = requests.session()
    flag = True
    img_name = "img"
    # 循环语句，直到获取正确的登录返回
    while flag:
        code_response = proxy_session.get(code_url,
                                          timeout=2, headers=request_header())
        code_file = code_response.content
        # print(code_file)
        img_url = 'D:/images/' + img + '.jpg'
 
        # 将二进制数据写入文件
        with open(img_url, 'wb') as f:
            f.write(code_file)
 
        dst_img_path = 'D:/images/' + img + 'b.jpg'
        img = Image.open(img_url)
        pre_identify_code = pytesseract.image_to_string(img, lang='eng')
        print("验证码：" + pre_identify_code)
        process_img(img, dst_img_path)
        img = Image.open(dst_img_path)
        # 去除不必要的回车与空格等字符
        identify_code = pytesseract.image_to_string(img, lang='eng') \
            .replace(' ', '').replace('\n', '').replace(',', '')
        print("处理后验证码：" + str(identify_code))
        time.sleep(1)
        login_post = {
            'userName': 'test',
            'userPass': 'test+123',
            'userIdentify': str(identify_code)
        }
        print(login_post)
        response_login = proxy_session.post("http://www.techlabplt.com:8085/user/login",
                                            timeout=2, headers=request_header(), data=login_post).text
 
        print(response_login)
		  # 1表示验证正确
        if response_login == '1':
            flag = False
        else:
            time.sleep(2)
    return proxy_session
 
 
if __name__ == '__main__':
    #  命名dataList数组，用于存储JSON数据
    dataList = []
 
    session = get_session()
    # 定义java、大数据、php 三个职位关键字
    job_list = ['java', 'php', '大数据']
    # 循环遍历职位关键字
    for job in job_list:
        print("职位关键字：" + job)
        for i in range(1, 51):
            resp = session.get(
                "http://www.techlabplt.com:8085/searchNew?orderBy=releaseDate&keyword=" +
                job + "&pageNum=" + str(i), headers=request_header())
            # 返回的转化为json格式
            return_json = resp.json()
            print(return_json)
            json_data = return_json['data']
 
            # 把jsonData对象添加到dataList数组
            dataList.append(json_data)
            # 网站有并发限制，所以使用睡眠降低连接速度
            time.sleep(2)
 
    # 新建命名为data.json的json文件并将dataList存入
    with open('D:/images/data.json', 'w', encoding='utf-8') as jsonFile:
        jsonFile.write(json.dumps(dataList, ensure_ascii=False, indent=4))
